package control.member;


import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import model.member.AnniversaryVO;
import model.member.MemberService;
import model.member.MemberVO;
import model.member.exception.InvalidNotFoundException;
import model.member.paging.Admin_ListVO;
import model.member.paging.ListVO;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

public class MemberController extends MultiActionController{
	private MemberService memberService;
	
	public MemberController(MemberService memberService) {
		super();
		this.memberService = memberService;
	}

	public MemberController() {
		super();
	}

	/**
	 * 타일즈 main_top 에서 회원 로그인 메서드
	 */
	public ModelAndView login(HttpServletRequest request, HttpServletResponse response,HttpSession session,MemberVO vo) throws Exception{
		HashMap map = null;
		//redirect:/index.jsp 사용이유
		//index로 할경우 forwarding에 forwarding 되므로 에러발생확률 증가하므로 redirect로 보낸후 forwarding 해준다.
		String location="redirect:/index.jsp";
		try {
			//로그인시 사용되는 메서드
			 map = memberService.login(vo);
			 //만약 정상적으로 로그인되는 경우 session에 넣어준다.
			if(map!=null){
				session.setAttribute("loginMember", map);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvalidNotFoundException e) {
			//만약 로그인 되지 않는 경우 tiles를 적용
			//main page를 로그인 화면으로 전환 시켜준다.
			location="login.member";
		}
	
		return new ModelAndView(location,"loginInfo",map);
	}	


	
	/**
	 *   회원가입시 아이디 중복체크하는 메서드
	 */
	public ModelAndView idCheck(HttpServletRequest request, HttpServletResponse response,MemberVO vo) throws Exception{
		//아이디 중복체크하는 메서드로 아이디가 존재시 true 반환, 존재하지 않을 경우 false 반환 후 JsonView로 처리
		boolean flag=memberService.idCheck(vo.getM_id());
		return new ModelAndView("JsonView","flag",flag);
	}
	/**
	 * 회원 가입클릭시 main에 회원가입 페이지 띄움
	 */
	public ModelAndView registerPage(HttpServletRequest request, HttpServletResponse response) throws Exception{
			return new ModelAndView("user/register.user");
	}	
	
	/**
	 *  * 회원 로그아웃 메서드
	 */
	public ModelAndView logout(HttpServletRequest request, HttpServletResponse response,HttpSession session,MemberVO vo) throws Exception{
		//logout시 session 부터 제거 후 session.getAttribute("loginMember")를 제거한다. 
		//혹시 모를 session의 존재자체를 완벽히 제거
		if(session!=null||session.getAttribute("loginMember")!=null){
			session.invalidate();
		}

			return new ModelAndView("redirect:/index.jsp");
	}	
	/**
	 * 이메일 체크하는 메서드
	 */
	public ModelAndView emailCheck(HttpServletRequest request, HttpServletResponse response,MemberVO vo) throws SQLException {
		String email=request.getParameter("mEmail");//text로 입력받는 부분
		String portalSite=request.getParameter("mEmailPortalSite");//select 로 선택된 부분
		boolean flag;
		try {
			//만약 동일한 이메일이 존재시 true 존재하 않을 경우 false를 반환하는 메서드
			flag = memberService.emailCheck(email,portalSite);
			//반환받은 boolean 값을 JsonView로 처리
			return new ModelAndView("JsonView","flag",flag);
		} catch (InvalidNotFoundException e) {
			//만약 @가 들어갔을 경우에 exception 처리
			return new ModelAndView("JsonView","fail",e.getMessage());
		}
	}
	
	/**
	 * 관라자가 업데이트 시 이메일 체크하는 메서드
	 * 만든이유?  기존의 이메일 체크 부분은 만약 관리자가 업데이트시 
	 * 					수정하고자 하는 사용자의 이메일과 동일하면 submit이 되지 않으므로
	 * 					db에서 사용자 아이디와 이메일로 검색 후 수정하고자 하는 사용자의
	 * 					이메일과 동일할 경우 사용가능하다는 메세지와 submit이 되도록 따로 처리하였음. 
	 */
	public ModelAndView emailCheckByAdmin(HttpServletRequest request, HttpServletResponse response,MemberVO vo) throws SQLException {
		String email=request.getParameter("mEmail");
		String portalSite=request.getParameter("mEmailPortalSite");
		String userId=request.getParameter("m_id");
		System.out.println(userId);
		try {
			
			HashMap map = memberService.emailCheckByAdmin(email,portalSite,userId);
			System.out.println(map);
			return new ModelAndView("JsonView","flag",map);
		} catch (InvalidNotFoundException e) {
			HashMap map=new HashMap();
			map.put("fail", true);
			return new ModelAndView("JsonView","flag",map);
		}
	}
	/**
	 *회원가입  
	 */
	public ModelAndView register(HttpServletRequest request, HttpServletResponse response,HttpSession session,MemberVO vo) throws InvalidNotFoundException {
		String anni1=request.getParameter("anniversary1");//기념일
		String date1=request.getParameter("a_date1");//날짜
		String anni2=request.getParameter("anniversary2");//기념일
		String date2=request.getParameter("a_date2");//날짜
		String email=request.getParameter("mEmail");
		String portalSite=request.getParameter("mEmailPortalSite");
		//Email 합치는 부분
		StringBuilder sb=new StringBuilder();
		sb.append(email+"@"+portalSite);
		System.out.println(sb);
	// 합친 이메일을 vo에 세팅 해주 는 부분
		vo.setM_email(sb.toString());
		String location="redirect:/index.jsp";
		//기념일 1
		//1 : 기념일 A_NO부분, vo.getM_id() : 회원의 아이디, anni1 : 기념일인지 생일인지 저장하는 부분, date1 : 해당날짜
		AnniversaryVO avo1=new AnniversaryVO(1,vo.getM_id(),anni1,date1);
		//기념일 2
		//1 : 기념일 A_NO부분, vo.getM_id() : 회원의 아이디, anni2 : 기념일인지 생일인지 저장하는 부분, date2 : 해당날짜
		AnniversaryVO avo2=new AnniversaryVO(2,vo.getM_id(),anni2,date2);
		//AnniversaryVO 생성 이유 : 너무많은 인자값이 생성되고 결국 AnniversaryVO를 생성해주어야 
		//										    ibatis에 적용시켜 값을 넣기 편하므로
		try {
			//총 3개의 매개변수 : 회원기기본 정보(vo), avo1(기념일1), avo2(기념일2)
			//가입이므로 리턴값은 필요없다.
			memberService.registerMember(vo,avo1,avo2);
			//회원 가입 후 바로 로그인 하여 메인화면을 띄우기 위해 login메서드 사용
			//왜? Controller의 login메서드를 사용하지 않았는가?
			//회원가입후 새로고침시 발생하는 Exception 처리를 위해.. 
			HashMap map = memberService.login(vo);
			//가입후 로그인한뒤 session에 가입한 회원의 정보를 넣어준다.
			if(map!=null){
				session.setAttribute("loginMember", map);
			}
		} catch (SQLException e) {
			location="redirect:/index.jsp";//회원가입후 새로고침시 나는 예외처리
		}
		//InvalidNotFoundException 처리하지 않은 이유?
		//회원가입시 이미 db에 제대로 들어갔다면 등록시 사용한 vo를 재사용하여 로그인하므로 
		//아이디가 비밀번호 틀렸다는 Exception이 발생할리가 없으므로...
		return new ModelAndView(location);
	}
	/**
	 * 회원탈퇴
	 */
	public ModelAndView deleteMember(HttpServletRequest request, HttpServletResponse response,HttpSession session, MemberVO vo) throws SQLException{
		String id=vo.getM_id();
		System.out.println(id);
		memberService.deleteMember(id);
		if(session!=null){
			session.invalidate();
		}
		return new ModelAndView("redirect:/index.jsp");
	}
	/**
	 * 회원 상세보기 페이지
	 */
	public ModelAndView userInfo(HttpServletRequest request, HttpServletResponse response, HttpSession session){
		return new ModelAndView("user/memberInfo.user");
	}
	public ModelAndView adminInfo(HttpServletRequest request, HttpServletResponse response, HttpSession session){
		return new ModelAndView("admin/memberInfo.admin");
	}
	/**
	 * 회원수정 페이지
	 */
	public ModelAndView updatePage(HttpServletRequest request, HttpServletResponse response){
		return new ModelAndView("user/update.user");
	}
	
	/**
	 * 회원정보수정
	 */
	public ModelAndView updateMember(HttpServletRequest request, HttpServletResponse response,HttpSession session,MemberVO vo) throws SQLException, InvalidNotFoundException{
		String anni1=request.getParameter("anniversary1");
		String date1=request.getParameter("a_date1");
		String anni2=request.getParameter("anniversary2");
		String date2=request.getParameter("a_date2");
		HashMap hmap=(HashMap)session.getAttribute("loginMember");
		MemberVO mvo=(MemberVO)hmap.get("mvoLogin");
		System.out.println(mvo);
		vo.setM_password(mvo.getM_password());
		AnniversaryVO avo1=new AnniversaryVO(1,vo.getM_id(),anni1,date1);
		AnniversaryVO avo2=new AnniversaryVO(2,vo.getM_id(),anni2,date2);
		HashMap map=memberService.updateMember(vo,avo1,avo2);
		if(map!=null){
			session.setAttribute("loginMember", map);
		}
		String id=vo.getM_id();
		MemberVO memInfo=memberService.memberInfo(id);
		return new ModelAndView("user/memberInfo.user");
	}	
	
	/**
	 * 관리자 모든 회원 정보 보기allmemberInfo
	 */
	public ModelAndView allmemberInfo(HttpServletRequest request, HttpServletResponse response) throws SQLException{
		return new ModelAndView("admin/memberInfo.admin");
	}	
	/**
	 * 아이디찾기 페이지로 이동
	 */
	public ModelAndView findIdAndPass(HttpServletRequest request, HttpServletResponse response){
		return new ModelAndView("findIdAndPass.member");
	}
	/**
	 * 회원 아이디 찾기
	 */
	public ModelAndView findId(HttpServletRequest request, HttpServletResponse response,MemberVO vo) throws SQLException{
		MemberVO mvo=null;
		String name=request.getParameter("m_name");
		String email=request.getParameter("m_email");
		try {
			mvo = memberService.findId(vo);
		} catch (InvalidNotFoundException e) {
			return new ModelAndView("JsonView","fail","찾는 아이디가 없습니다.");
		}
		return new ModelAndView("JsonView","mvo",mvo);
	}
	/**
	 * 회원 비밀번호 찾기
	 */
	public ModelAndView findPassword(HttpServletRequest request, HttpServletResponse response,MemberVO vo)throws SQLException{
		String id=request.getParameter("m_id1");
		String email=request.getParameter("m_email1");
		vo.setM_id(id);
		vo.setM_email(email);
		String str=memberService.findPassword(vo);
		return new ModelAndView("updatePass.member","idInfo",str);
	}
	/**
	 * 회원 비밀번호 새롭게 할당
	 */
	public ModelAndView changePass(HttpServletRequest request, HttpServletResponse response,MemberVO vo)throws SQLException{
			String pass=request.getParameter("m_password");
			memberService.changePass(vo);
		return new ModelAndView("home");
	}
	/**
	 * 관리자가 전체회원 목록
	 */
	public ModelAndView findAllMemberInfo(HttpServletRequest request, HttpServletResponse response)throws SQLException{
		String pageNo=request.getParameter("pageNo");
		ListVO lvo=memberService.getMemberList(pageNo);
	return new ModelAndView("admin/memberList.admin","allMemberInfo",lvo);
}
	/**
	 * 관리자가 회원삭제 회원이랑 같이 사용해도 될듯..
	 */
	public ModelAndView deleteMemberByAdmin(HttpServletRequest request, HttpServletResponse response,HttpSession session,MemberVO vo)throws SQLException{
		System.out.println("deleteMemberByAdmin 식작");
		String id=request.getParameter("m_id");
		System.out.println("sssss"+vo);
		String pageNo=request.getParameter("pageNo");
		memberService.deleteMember(id);
		ListVO lvo=memberService.getMemberList(pageNo);
		return new ModelAndView("admin/memberList.admin","allMemberInfo",lvo);
	}
	/**
	 * 관리자가 저장된 멤버들을 보는 메서드
	 */
	public ModelAndView getMemberInfo(HttpServletRequest request, HttpServletResponse response,HttpSession session,MemberVO vo) throws Exception{
		HashMap map = null;
		map=memberService.getMemberInfo(vo.getM_id());
		session.setAttribute("getMemberInfo", map);
		return new ModelAndView("admin/updateMemberByAdmin.admin","getMemberInfo",map);
	}
	/**
	 * 관리자가 회원정보수정
	 */								
	public ModelAndView updateMemberByAdmin(HttpServletRequest request, HttpServletResponse response,HttpSession session,MemberVO vo) throws SQLException, InvalidNotFoundException{
		String anni1=request.getParameter("anniversary1");
		String date1=request.getParameter("a_date1");
		String anni2=request.getParameter("anniversary2");
		String date2=request.getParameter("a_date2");
		AnniversaryVO avo1=new AnniversaryVO(1,vo.getM_id(),anni1,date1);
		AnniversaryVO avo2=new AnniversaryVO(2,vo.getM_id(),anni2,date2);
		String email=request.getParameter("m_email");
		String portalSite=request.getParameter("mEmailPortalSite");
		StringBuilder sb=new StringBuilder();
		sb.append(email+"@"+portalSite);
		System.out.println(sb);
		vo.setM_email(sb.toString());
		memberService.updateMemberByAdmin(vo,avo1,avo2);
		String pageNo=request.getParameter("pageNo");
		ListVO lvo=memberService.getMemberList(pageNo);
		return new ModelAndView("admin/memberList.admin","allMemberInfo",lvo);
	}
	/**
	 * 회원정보보기에서 사용자가 패스워드를 바꾸기위해서 클릭시 실행
	 */								
	public ModelAndView changePassPage(HttpServletRequest request, HttpServletResponse response){
		return new ModelAndView("user/changePass.user");
	}
	/**
	 * 사용자가 비밀번호만을 바꾸고 싶을때 사용하는
	 * 기존 비밀번호가 맞아야함,
	 * session으로 아이디를 가져와서 request의 비밀번호랑 비교
	 * 리턴으로 아이디를 받은다음 request로 변경된 비밀번호를 받고 controller에서 vo.setPass로 묶어 넘긴다.
	 */
	public ModelAndView changePassword(HttpServletRequest request, HttpServletResponse response,HttpSession session,MemberVO vo) throws SQLException{
		System.out.println("changePassword 실행");
		System.out.println(session.getAttribute("loginMember"));
		
		HashMap map2=(HashMap)session.getAttribute("loginMember");
		MemberVO mvo=(MemberVO)map2.get("mvoLogin");
		String id=mvo.getM_id();//로그인된 사용자의 아이디
		String password1=request.getParameter("password1"); //바뀔패스
		String password=request.getParameter("m_password"); //기존패스
		System.out.println("control changePassword id,기존패스,바꿀패스:"+id+", "+password+", "+password1);
		//세션으로 사용자의 아이디와 jsp에서 입력한 아이디를 받아왔다.
		
		HashMap map=new HashMap();
		map.put("id", id); //session id
		map.put("vo", vo);
		map.put("pass", password); //request pass 기존패스
		map.put("pass1", password1); //request pass 바뀔패스
		System.out.println("control changePassword map:"+map);
		try {
			MemberVO mvo1=memberService.changePassword(map);
		} catch (InvalidNotFoundException e) {
			return new ModelAndView("invalidpage.error");
		}
		
		return new ModelAndView("user/memberInfo.user");
	}
	/**
	 * 관리자가 회원의 아이디, 이메일, 이메일+아이디, 이름으로 검색할 수 있는 메서드
	 */
	public ModelAndView searchByMemberInfo(HttpServletRequest request, HttpServletResponse response,HttpSession session,MemberVO vo) throws Exception{
		String searchByMethod=request.getParameter("searchByMethod");//select를 통해 입력받은 검색조건이 id인지 email인지 name인지 확인하는 값
		String searchMember=request.getParameter("searchMember");//text로 입력 받은 값
		String pageNo=request.getParameter("pageNo");//검색한 후에도 페이징을 적용하기 위해사용....
		System.out.println("searchByMethod "+searchByMethod+" searchMember "+searchMember);
		
		if("m_id".equals(searchByMethod)){
			//searchByMethod(검색 조건)이 id일 경우 vo에 vo.setM_id()를 통해 searchMember(검색하고자하는 값)를 넣는다.
			vo.setM_id(searchMember);
		}else if("m_email".equals(searchByMethod)){
			//searchByMethod(검색 조건)이 email일 경우 vo에 vo.setM_email()를 통해 searchMember(검색하고자하는 값)을 넣는다.
			vo.setM_email(searchMember);
		}else if("m_name".equals(searchByMethod)){
			//searchByMethod(검색 조건)이 name일 경우 vo에 vo.setM_name()를 통해 searchMember(검색하고자하는 값)을 넣는다.
			vo.setM_name(searchMember);
		}
		//왜 HashMap을 통해 넘기는가?
		//페이징 적용하기위해서는 searchByMethod,searchMember의 값이 필요하다.
		//jsp에서 ListVO를 통해 손쉽게 접근하기위해 HashMap을 추가한 Admin_ListVO를 추가하여 
		//searchByMethod,searchMember의 값을 map으로 전달함...
		HashMap map=new HashMap();
		map.put("mvo", vo);
		map.put("searchByMethod", searchByMethod);
		map.put("searchMember", searchMember);
		map.put("pageNo", pageNo);
		Admin_ListVO lvo=memberService.searchByMemberInfo(map);
		System.out.println(lvo);
		//검색시에는 새로운 페이지를 호출하도록 함.
		return new ModelAndView("admin/memberListBySearch.admin","searchByMemberInfo",lvo);
	}
	
	
}
